package smallfrench.moteur.biblio.err;

import smallfrench.moteur.biblio.AClasse;
import smallfrench.moteur.biblio.AnnotationMembre;
import smallfrench.moteur.biblio.RClasse;
import smallfrench.moteur.interp.RObjet;
import smallfrench.moteur.interp.err.RException;
import smallfrench.moteur.lexer.Position;

/**
 * Erreur de classe : doit survenir lorsque qu’une classe attendue ne
 * correspond pas à une classe fournie.
 * 
 * @author antoine1023
 *
 */
public class ErreurClasse extends AException {

	public static final AClasse CLASSE = AClasse.creer(ErreurClasse.class);

	/**
	 * 
	 * @param objet L’objet de classe inattendue
	 * @param classeAttendue La classe attendue
	 */
	@AnnotationMembre
	public ErreurClasse(RObjet objet, RClasse classeAttendue) {

		this(objet, classeAttendue.toString());
	}

	public ErreurClasse(RObjet objet, String classeAttendue) {

		super(objet + " (classe " + objet.classe +
				") n’est pas un(e) (" + classeAttendue + ")");
	}

	public ErreurClasse(String description) {
		super(description);
	}

	//------------------------------------------------

	public static RException nouvelleException(
			Position position,
			RObjet objet,
			RClasse classeAttendue) {

		return nouvelleException(position, objet, classeAttendue.toString());
	}

	public static RException nouvelleException(
			RObjet objet,
			RClasse classeAttendue) {

		return nouvelleException(objet, classeAttendue.toString());
	}

	public static RException nouvelleException(
			Position position,
			RObjet objet,
			String classeAttendue) {

		if (objet == null)
			return ErreurRien.nouvelleException(position);

		ErreurClasse ec = new ErreurClasse(objet, classeAttendue);
		ec.ajouterPosition(position);
		return new RException(ec);
	}

	public static RException nouvelleException(
			RObjet objet,
			String classeAttendue) {

		if (objet == null)
			return ErreurRien.nouvelleException();

		ErreurClasse ec = new ErreurClasse(objet, classeAttendue);
		return new RException(ec);
	}
}
